#include "POWER.h"

void POWER_turnAll(power_state state)
{
    NRF24L01_turn(state);
    MPU6050_turn(state);
    OLED_turn(state);
    UART3_turn(state);
    GraySensor_turn(state);
    UART2_turn(state);
}

/**
 * @brief 开关 NRF24L01 无线蓝牙模块
 * 
 * @param state 开或关: on or off
 */
void NRF24L01_turn(power_state state)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    if(IS_BIT_0(RCC->APB2ENR, BIT(2)))
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    }
    GPIO_InitStruct.GPIO_Pin  = NRF24L01_POWER;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    if(state == on)
    {
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
        GPIO_SetBits(GPIOA, NRF24L01_POWER);
    }
    else if(state == off)
    {
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
        GPIO_ResetBits(GPIOA, NRF24L01_POWER);
    }
}

/**
 * @brief 开关 MPU6050 陀螺仪模块
 * 
 * @param state 开或关: on or off
 */
void MPU6050_turn(power_state state)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    if(IS_BIT_0(RCC->APB2ENR, BIT(3)))
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    }
    GPIO_InitStruct.GPIO_Pin  = MPU6050_POWER;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    if(state == on)
    {
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
        GPIO_SetBits(GPIOB, MPU6050_POWER);
    }
    else if(state == off)
    {
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
        GPIO_ResetBits(GPIOB, MPU6050_POWER);
    }
}

/**
 * @brief 开关 OLED 串口屏模块
 * 
 * @param state 开或关: on or off
 */
void OLED_turn(power_state state)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    if(IS_BIT_0(RCC->APB2ENR, BIT(3)))
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    }
    GPIO_InitStruct.GPIO_Pin  = OLED_POWER;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    if(state == on)
    {
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
        GPIO_SetBits(GPIOB, OLED_POWER);
    }
    else if(state == off)
    {
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
        GPIO_ResetBits(GPIOB, OLED_POWER);
    }
}

/**
 * @brief 开关串口3电源
 * 
 * @param state 开或关: on or off
 */
void UART3_turn(power_state state)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    if(IS_BIT_0(RCC->APB2ENR, BIT(3)))
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    }
    GPIO_InitStruct.GPIO_Pin  = UART3_POWER;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    if(state == on)
    {
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
        GPIO_SetBits(GPIOB, UART3_POWER);
    }
    else if(state == off)
    {
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(GPIOB, &GPIO_InitStruct);
        GPIO_ResetBits(GPIOB, UART3_POWER);
    }
}

/**
 * @brief 开关灰度传感器
 * 
 * @param state 开或关: on or off
 */
void GraySensor_turn(power_state state)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    if(IS_BIT_0(RCC->APB2ENR, BIT(4)))
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    }
    GPIO_InitStruct.GPIO_Pin  = GRAY_POWER;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    if(state == on)
    {
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStruct);
        GPIO_SetBits(GPIOC, GRAY_POWER);
    }
    else if(state == off)
    {
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(GPIOC, &GPIO_InitStruct);
        GPIO_ResetBits(GPIOC, GRAY_POWER);
    }
}

/**
 * @brief 开关串口2电源
 * 
 * @param state 开或关: on or off
 */
void UART2_turn(power_state state)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    if(IS_BIT_0(RCC->APB2ENR, BIT(4)))
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    }
    GPIO_InitStruct.GPIO_Pin  = UART2_POWER;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    if(state == on)
    {
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStruct);
        GPIO_SetBits(GPIOC, UART2_POWER);
    }
    else if(state == off)
    {
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
        GPIO_Init(GPIOC, &GPIO_InitStruct);
        GPIO_ResetBits(GPIOC, UART2_POWER);
    }
}